fig.show()
$$R_{s}-R_{f}=\alpha+\beta_{mkt}\left(R_{mkt}-R_{f}\right)+\beta_{SMB}R_{SMB}+\beta_{HML}R_{HML}$$
where:
$R_{s}-R_{f}$ = cost of equity
$R_{s}$ = return on stock
$R_{f}$ = risk-free rate
$\beta_{mkt}$ = market beta
$R_{mkt}$ = market premuim
$\beta_{SMB}$ = size beta
$R_{SMB}$ = size premuim
$\beta_{HML}$ = value beta
$R_{HML}$ = value premuim
*Model was chosen instead of traditional CAPM due to the stock's low Beta.
Get Monthly Fama-french 3 Factors from Kenneth R. French data library And Historical Returns
data.tail()
| Mkt-RF | SMB | HML | RF | ENB | ENB.TO-RF | |
|---|---|---|---|---|---|---|
| Date | ||||||
| 2022-06-30 | -0.0843 | 0.0209 | -0.0597 | 0.0006 | -0.084291 | -0.084891 |
| 2022-07-31 | 0.0957 | 0.0281 | -0.0410 | 0.0008 | 0.063181 | 0.062381 |
| 2022-08-31 | -0.0377 | 0.0139 | 0.0031 | 0.0019 | -0.068393 | -0.070293 |
| 2022-09-30 | -0.0935 | -0.0082 | 0.0003 | 0.0019 | -0.099952 | -0.101852 |
| 2022-10-31 | 0.0783 | 0.0010 | 0.0806 | 0.0023 | 0.049865 | 0.047565 |
print('Market Beta:',beta_m, 'Size Beta:', beta_s, 'Value Beta', beta_v)
results.summary()
Market Beta: 0.7469601433705513 Size Beta: 0.21813585209706277 Value Beta 0.47913501647151674
| Dep. Variable: | ENB.TO-RF | R-squared: | 0.496 |
|---|---|---|---|
| Model: | OLS | Adj. R-squared: | 0.469 |
| Method: | Least Squares | F-statistic: | 18.38 |
| Date: | Fri, 25 Nov 2022 | Prob (F-statistic): | 2.01e-08 |
| Time: | 02:51:04 | Log-Likelihood: | 95.829 |
| No. Observations: | 60 | AIC: | -183.7 |
| Df Residuals: | 56 | BIC: | -175.3 |
| Df Model: | 3 | ||
| Covariance Type: | nonrobust |
| coef | std err | t | P>|t| | [0.025 | 0.975] | |
|---|---|---|---|---|---|---|
| const | 0.0005 | 0.007 | 0.076 | 0.939 | -0.013 | 0.014 |
| Mkt-RF | 0.7470 | 0.126 | 5.913 | 0.000 | 0.494 | 1.000 |
| SMB | 0.2181 | 0.255 | 0.856 | 0.396 | -0.292 | 0.729 |
| HML | 0.4791 | 0.150 | 3.203 | 0.002 | 0.179 | 0.779 |
| Omnibus: | 1.942 | Durbin-Watson: | 1.871 |
|---|---|---|---|
| Prob(Omnibus): | 0.379 | Jarque-Bera (JB): | 1.235 |
| Skew: | 0.317 | Prob(JB): | 0.539 |
| Kurtosis: | 3.303 | Cond. No. | 39.6 |
Calculate Cost of Equity
risk_free = data['RF'].mean()
risk_free
exp_return = risk_free + beta_m*market_premium + beta_s*size_premium + beta_v*value_premium
cost_capital=exp_return*12
print(round(cost_capital*100,2),"%")
9.66 %
$$P=\frac{D_{1}}{(R+1)^1}+\frac{D_{2}}{(R+1)^2}+ ... +\frac{D_{N}}{(R+1)^N}+\frac{D_{N}(1+G2)+D_{N}H(G1-G2)}{\frac{(R-G2)}{(R+1)^N}}$$
where:
$P$ = price
$D_{1}$ = value of next year dividend
$R$ = constant cost of equity capital
$N$ = period
$G1$ = High growth rate
$G2$ = Transitional growth rate
$G3$ = constant growth rate in perpetuity
Assumptions:
$N$ = 5
$G1$ = 10Y Historical Div Growth (mean: 10%, std: 8.5%)
$G2$ = 5Y Historical Div Growth (mean: 7%, std: 3.7%)
$G3$ = mean: 2%, std: 0.5%
$Beta$ = 5Y Historical Beta (mean: 0.80, std: 0.074)
fig = px.histogram(df, x="Price",nbins=1000,title="Probability Distribution")
fig.show()
#py.plot(fig, filename = 'dist', auto_open=True)
quants = df.quantile([i / 20 for i in range(1, 20)])
styled_df(quants)
| High Growth | Transitional Growth | Perpetual Growth | Cost of Capital | Beta | Price | Upside | |
|---|---|---|---|---|---|---|---|
| 0.050000 | -3.17% | 0.95% | 1.17% | 9.13% | 0.68 | $43.36 | -21.88% |
| 0.100000 | -0.06% | 2.32% | 1.36% | 9.34% | 0.71 | $47.49 | -14.43% |
| 0.150000 | 2.04% | 3.25% | 1.48% | 9.49% | 0.73 | $50.47 | -9.06% |
| 0.200000 | 3.68% | 4.00% | 1.58% | 9.60% | 0.74 | $52.96 | -4.58% |
| 0.250000 | 5.07% | 4.63% | 1.66% | 9.70% | 0.75 | $55.22 | -0.51% |
| 0.300000 | 6.35% | 5.20% | 1.74% | 9.79% | 0.76 | $57.29 | 3.22% |
| 0.350000 | 7.55% | 5.72% | 1.81% | 9.87% | 0.77 | $59.27 | 6.79% |
| 0.400000 | 8.69% | 6.22% | 1.87% | 9.95% | 0.78 | $61.24 | 10.35% |
| 0.450000 | 9.77% | 6.71% | 1.94% | 10.03% | 0.79 | $63.21 | 13.89% |
| 0.500000 | 10.83% | 7.19% | 2.00% | 10.10% | 0.8 | $65.11 | 17.31% |
| 0.550000 | 11.92% | 7.65% | 2.06% | 10.18% | 0.81 | $67.06 | 20.83% |
| 0.600000 | 13.04% | 8.13% | 2.13% | 10.25% | 0.82 | $69.14 | 24.58% |
| 0.650000 | 14.16% | 8.62% | 2.19% | 10.33% | 0.83 | $71.36 | 28.58% |
| 0.700000 | 15.34% | 9.15% | 2.26% | 10.41% | 0.84 | $73.81 | 32.99% |
| 0.750000 | 16.61% | 9.72% | 2.34% | 10.50% | 0.85 | $76.45 | 37.74% |
| 0.800000 | 18.02% | 10.35% | 2.42% | 10.60% | 0.86 | $79.46 | 43.16% |
| 0.850000 | 19.69% | 11.09% | 2.52% | 10.72% | 0.88 | $83.14 | 49.81% |
| 0.900000 | 21.80% | 12.03% | 2.64% | 10.87% | 0.9 | $88.02 | 58.59% |
| 0.950000 | 24.85% | 13.39% | 2.82% | 11.08% | 0.92 | $95.78 | 72.58% |
fig = px.scatter(df, y='Price', x=input_cols[3],title="Cost of Capital Sensitivity")
fig.show()
fig = px.scatter(df, y='Price', x=input_cols[2],title="Beta Sensitivity")
fig.show()
fig = px.scatter(df, y='Price', x=input_cols[0],title="High Growth Sensitivity")
fig.show()